#include<iostream>
#include<string>
#include<pthread.h>
#include<cstdlib>
#include<unistd.h>
#include<thread>
using namespace std;

string toHex(pthread_t tid)//将地址转化为16进制
{
    char hex[64];
    snprintf(hex,sizeof(hex),"%p",tid);
    return hex;
}
void* threadRoutine(void* args)
{
    while(true)
    {
        cout<<"thread id:"<<toHex(pthread_self())<<endl;
        //printf("%p",pthread_self());//也可以手动控制
        sleep(1);
    }
}
int main()
{
    pthread_t tid;
    pthread_create(&tid,nullptr,threadRoutine,(void*)"thread 1");
    cout << "main thread create thead done, new thread id : " << toHex(tid) << endl;
    pthread_join(tid, nullptr);
    return 0;
}

// void threadrun()
// {
//     while(true)
//     {
//         cout<<"I am a new thread for c++"<<endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     thread t1(threadrun);
//     t1.join();
//     return 0;
// }
// class Request
// {
// public:
//     Request(int start,int end,const string &threadname)
//     : start_(start),end_(end),threadname_(threadname)
//     {}
// public:
//     int start_;
//     int end_;
//     string threadname_;
// };

// class Response
// {
// public:
//     Response(int result,int exitcode)
//     :result_(result),exitcode_(exitcode)
//     {}
// public:
//     int result_;
//     int exitcode_;
// };

// void* sumCount(void *args)// 线程的参数和返回值，不仅仅可以用来进行传递一般参数，也可以传递对象！！
// {
//     Request *rq=static_cast<Request*>(args);
//     Response *rsp=new Response(0,0);//在堆上开辟空间，确保退出函数还可以继续访问
//     for(int i=rq->start_;i<=rq->end_;i++)
//     {
//         cout<<rq->threadname_<<"is runing,calling  "<<i<<endl;
//         rsp->result_+=1;
//         usleep(100000);//微秒级别
//     }
//     delete rq;
//     //pthread_exit((void*)100);//主动退出，这里也只是在合适的位置做演示，若退出会导致创建的rsp资源未传出去导致段错误
//     return rsp;//线程默认退出方式
// }
// int main()
// {
//     pthread_t tid;
//     Request *rq=new Request(1,100,"thread 1");//在sumCount函数中被释放资源
//     pthread_create(&tid,nullptr,sumCount,rq);

//     //pthread_cancel(tid);若此时终止进程会导致段错误，没有及时释放资源
//     void *ret;
//     pthread_join(tid,&ret);//主线程阻塞等待
//     Response *rsp=static_cast<Response *> (ret);
//     cout<<"rsp->result: "<<rsp->result_<<",exitcode"<<rsp->exitcode_<<endl;
//     delete rsp;
//     return 0;
// }

// int g_val=10;//定义全局变量

// void* threadRoutine(void* args)
// {
//     const char* name=(const char*)args;
//     while(true)
//     {
//         printf("%s, pid:%d, g_val:%d, &g_val:%p\n",name,getpid(),g_val,&g_val);
//         sleep(1);
//     }
// }
// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid,nullptr,threadRoutine,(void*)"thread 1");
//     while(true)
//     {
//         printf("main thread pid: %d, g_val: %d, &g_val: %p, create new thread:%p\n"
//         ,getpid(),g_val,&g_val,tid);
//         sleep(1);
//         g_val++;
//     }
//     return 0;
// }
